package cn.topcodes.tcsf.app.service;

import cn.topcodes.tcsf.admin.commons.generic.IGenericService;
import cn.topcodes.tcsf.app.domain.entity.AppClient;
import cn.topcodes.tcsf.app.domain.form.AppClientInfo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by Unicorn on 2017/11/17.
 */
public interface AppClientService extends IGenericService<AppClient> {
    /**
     * 在指定app应用中获取app用户客户端信息
     * @param app       app
     * @param appUserId app用户ID
     * @return  app客户端信息
     */
    AppClient findBy(String app, Long appUserId);

    /**
     * 登录默认app客户端
     * @param appUserId app用户ID
     * @return   凭证
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    String loginDefaultApp(Long appUserId);

    /**
     * 登录指定客户端信息
     * @param appUserId     app用户ID
     * @param appClientInfo app客户端信息
     * @return  token
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    String login(Long appUserId, AppClientInfo appClientInfo);

    /**
     * 退出默认APP
     * @param token 凭证
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    void logoutDefaultApp(String token);

    /**
     * 退出指定app
     * @param app   app
     * @param token 凭证
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    void logout(String app, String token);

    /**
     * 通过token查找
     * @param token 凭证
     * @return  app客户端信息
     */
    AppClient findByToken(String token);

    /**
     * 查找该用户在默认app所有客户端信息
     * @param appUserId     app用户ID
     * @return      客户端信息列表
     */
    List<AppClient> getDefaultAppClients(Long appUserId);

    /**
     * 查找该用户在默认app所有Token
     * @param appUserId     app用户ID
     * @return      Token信息列表
     */
    List<String> getDefaultAppTokens(Long appUserId);

    /**
     * 查找该用户在默认app的Token
     * @param appUserId app用户id
     * @return  token凭证
     */
    String getDefaultAppToken(Long appUserId);

    /**
     * 获取指定app应用，用户的凭证
     * @param app   app
     * @param appUserId 用户id
     * @return  凭证
     */
    String getAppToken(String app, Long appUserId);

    /**
     * 获取指定应用，app所有凭证
     * @param app       app
     * @param appUserId app用户ID
     * @return  凭证列表
     */
    List<String> getAppTokens(String app, Long appUserId);

    /**
     * 通过app用户id查找其所有app客户端信息
     * @param appUserId    app用户id
     * @return  app客户端信息列表
     */
    List<AppClient> findByAppUserId(Long appUserId);
}
